class Phone:
    brand = 'xiaomi'  # 定义类属性及默认值

    def __init__(self):  # 魔术方法，初始化，将对象p，用self变量传入
        print('-----init')
        self.price = 1000  # 定义对象属性及默认值
        self.brand = 'huawei'

    def call(self):
        print('---------call')
        print('Phone的价格为：', self.price)


Phone.brand = 'iphone'  # 更改类属性值

p = Phone()
p.price = 4000  # 给对象添加或更改属性
p.call()

p1 = Phone()
p1.call()

print('---' * 9)


class Person:
    name = '张三'

    def __init__(self, name, age):  # 初始化需要传name和age两个值
        self.name = name
        self.age = age

    def eat(self, food):  # 普通带参方法
        print('{}正在吃{}'.format(self.name, food))

    def run(self):
        print('{},今年{}岁，正在'.format(self.name, self.age))


p = Person('lisi', 21)  # 创建对象，初始化传入
p.eat('红烧肉')
p.run()

print('--------' * 9)


class Dog:
    nickname = '小黑'

    def __init__(self, nickname):
        self.name = nickname

    def run(self):
        print('{}在院子里跑来跑去'.format(self.name))

    @classmethod  # 定义类方法依赖装饰器，有参数，cls就代表类，不能用对象变量，变量必须在类里创建，类方法不能调用对象方法
    def test(cls):
        print(cls.nickname)

    @classmethod
    def update_nickname(cls):#使用类方法修改类属性值
        cls.nickname='小芳'
        print('------------->类方法改类变量',cls.nickname)

    @staticmethod
    def test1():#定义静态方法，无参，装饰器
        print('-------->静态方法')
        print(Dog.nickname)#只能用类的属性方法，不能用对象的

d = Dog('大黄')
#对象方法必须用对象调用
d.run()
#类方法调用，不依赖对象
d.test()
Dog.test()
Dog.update_nickname()
#静态方法只能用类调用
Dog.test1()
